{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练卷积神经网络"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 数据增广(data augmentation)\n",
    "增加数据的多样性，扩大数据集一定程度上解决过拟合问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import torch\n",
    "import numpy as np\n",
    "from torch import nn, optim\n",
    "import matplotlib.pyplot as plt\n",
    "from torch.autograd import Variable\n",
    "from torch.utils.data import DataLoader\n",
    "import torch.utils.model_zoo as model_zoo\n",
    "from torchvision import transforms, datasets, models\n",
    "\n",
    "use_cuda = torch.cuda.is_available()                    # gpu可用\n",
    "device = torch.device('cuda' if use_cuda else 'cpu')    # 优先使用gpu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.训练集和测试集的样本数: 50000 10000\n"
     ]
    }
   ],
   "source": [
    "data_tf = transforms.Compose([\n",
    "    transforms.RandomResizedCrop(224),                               # 从原图随机裁剪224*224的图像\n",
    "    transforms.RandomHorizontalFlip(),                               # 0.5概率水平翻转\n",
    "    transforms.RandomVerticalFlip(),                                 # 0.5概率垂直翻转\n",
    "    transforms.RandomRotation(10),                                   # 在(-10,10)范围内旋转\n",
    "    transforms.ColorJitter(0.05, 0.05, 0.05 , 0.05),                 # HSV及对比度变化\n",
    "    transforms.ToTensor(),       # 把PIL.Image及numpy.ndarray对象转换为tensor，并缩放到[0,1]内 \n",
    "    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])  # 归一化到[-1,1]\n",
    "])\n",
    "\n",
    "train_datasets = datasets.CIFAR10(root='./data/cifar10', train=True, transform=data_tf, download=False)\n",
    "test_datasets = datasets.CIFAR10(root='./data/cifar10', train=False, transform=data_tf)\n",
    "\n",
    "print('1.训练集和测试集的样本数:', len(train_datasets), len(test_datasets))\n",
    "\n",
    "train_loader = DataLoader(train_datasets, batch_size=32, shuffle=True)\n",
    "test_loader = DataLoader(test_datasets, batch_size=32, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.测试集的数据维度: torch.Size([32, 3, 224, 224]) torch.Size([32])\n",
      "2.测试集的类型: <class 'numpy.ndarray'> <class 'list'>\n"
     ]
    }
   ],
   "source": [
    "test_loader = iter(test_loader)              # 将其变为迭代器\n",
    "test = next(test_loader)\n",
    "print('1.测试集的数据维度:', test[0].shape, test[1].shape)\n",
    "print('2.测试集的类型:', type(test_datasets.test_data), type(test_datasets.test_labels))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.十个类别样本的索引: [3, 6, 25, 0, 22, 12, 4, 13, 1, 11]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2630a0e9cf8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n",
      "1.训练数据的原始维度: (3, 224, 224)\n",
      "2.显示图像所需的维度: (224, 224, 3)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2630a3f19b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 显示测试集中的样本，样本少运算快\n",
    "%matplotlib inline\n",
    "class_dict = {0:'airplane', 1:'automobile', 2:'bird', 3:'cat', 4:'deer', 5:'dog', \n",
    "              6:'frog', 7:'horse', 8:'ship', 9:'truck'}\n",
    "\n",
    "# 显示transforms前的数据\n",
    "def show():\n",
    "    test = test_datasets.test_labels     # 测试数据维度 (10000, 32, 32, 3) 样本1000列表\n",
    "    sample_index = [test.index(i) for i in range(10)]\n",
    "    print('1.十个类别样本的索引:', sample_index)\n",
    "    sample_data = test_datasets.test_data[sample_index]    # 多维数组切片 get [10,32,32,3]\n",
    "#     print(sample_data.shape)\n",
    "    fig = plt.figure(figsize=[6,3])     # 180*90 宽*高，\n",
    "    plt.axis('off')\n",
    "    for i in range(10):                 # 开始画图\n",
    "        fig.add_subplot(2, 5, i+1)      # 选择画图区域\n",
    "#         plt.rcParams['figure.figsize'] = (0.1,0.1)\n",
    "        plt.axis('off')\n",
    "        plt.title(class_dict[i])\n",
    "        plt.imshow(sample_data[i])    # 画特点的样本\n",
    "    plt.savefig('./image/test.png')\n",
    "    plt.show()\n",
    "\n",
    "# 显示transforms后的数据\n",
    "def show_trans():\n",
    "    test = next(test_loader)                 # test[0] data数据，test[1]标签\n",
    "    plt.rcParams['figure.figsize'] = (2, 2)  # 设置figure_size尺寸\n",
    "    random_index = np.random.randint(32)     # [0~31)随机取数\n",
    "    img = test[0][random_index]              # 取第一样本\n",
    "    img = img.numpy()                        # 转换为numpy数组\n",
    "    img = (img*0.5 + 0.5 )*255               # 将[-1,1]的数据转换到[0,255]上\n",
    "    print('1.训练数据的原始维度:', img.shape)\n",
    "    img = np.transpose(img, [1,2,0])         # 维度[0,1,2] -> [1,2,0]将通道放到最后一维\n",
    "    print('2.显示图像所需的维度:', img.shape)\n",
    "    plt.axis('off')\n",
    "    plt.title(class_dict[int(test[1][random_index].numpy())])   # 取样本的标签\n",
    "    plt.imshow(img)\n",
    "    plt.savefig('./image/test2.png')\n",
    "show()\n",
    "print('-'*50)\n",
    "show_trans()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "小结:\n",
    "- `fig = plt.figure(figsize=[6,3])`默认1代表30个像素点，该句生成180*90宽和高的图像，`plt.rcParams['figure.figsize'] = (6,3)`也有同样的功能\n",
    "- 四维的数组arr，使用`arr[first_dim][second_dim][third_dim][fourth_dim]`访问各个维度，`arr[first_dim]`表示访问第一维度使用first_dim，其他三个维度数据都使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2 微调网络(Finetune)\n",
    "\n",
    "参考网页：[pytorch学习笔记（十一）：fine-tune 预训练的模型](https://blog.csdn.net/u012436149/article/details/78038098) 、\n",
    "[Pytorch框架下Finetune注意点](https://blog.csdn.net/xjcvip007/article/details/78583738) 、\n",
    "[PyTorch参数初始化和Finetune](https://blog.csdn.net/u012759136/article/details/65634477)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.1 局部微调\n",
    "1. 保持网络的卷积层部分权重不变，该部分使用**预训练的权重**；\n",
    "2. **修改全连接层**的输出维度，然后只训练该层的权重\n",
    "\n",
    "#### finetune方式:\n",
    "1. 使用torchvision的模型微调模式，设置`models.resnet18(pretrained=True)`，使用`finetune_model.fc = nn.Linear(512, 10)`修改最后全连接层的输出维度就可以训练了\n",
    "2. 更加普遍的方式，直接读取模型的权重并修改模型的全连接层(torchvision中finetune也是该方式)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.权重名称及梯度设置情况:\n",
      "layer4.1.bn1.weight         False \n",
      "layer4.1.bn1.bias           False \n",
      "layer4.1.conv2.weight       False \n",
      "layer4.1.bn2.weight         False \n",
      "layer4.1.bn2.bias           False \n",
      "fc.weight                   True  \n",
      "fc.bias                     True  \n"
     ]
    }
   ],
   "source": [
    "# 方式一， 使用torchvison的设置\n",
    "finetune_model =  models.resnet18(pretrained=True)   # 权重在C:\\Users\\David\\.torch\\models位置\n",
    "for param in finetune_model.parameters():            # 使所有权重的require_grad为 False\n",
    "    param.requires_grad = False\n",
    "finetune_model.fc = nn.Linear(512, 10)  # 修改模型最后的全连接层的维度为10，require_grad默认为True\n",
    "\n",
    "weight_log = []\n",
    "for param in finetune_model.named_parameters():\n",
    "    weight_log += ['{:<25}   {:<6}'.format(param[0], str(param[1].requires_grad))]\n",
    "print('1.权重名称及梯度设置情况:')\n",
    "for log in weight_log[-7:]:\n",
    "    print(log)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------\n",
      "Epoch 1\n",
      "Batches 0 loss 2.6013\n",
      "Batches 10 loss 2.2674\n",
      "Batches 20 loss 2.3568\n",
      "Batches 30 loss 2.2444\n",
      "Batches 40 loss 2.1512\n",
      "Batches 50 loss 2.3595\n",
      "Batches 60 loss 2.1950\n",
      "Batches 70 loss 2.1989\n",
      "Batches 80 loss 2.0041\n",
      "Batches 90 loss 1.9305\n"
     ]
    }
   ],
   "source": [
    "# 定义损失函数和优化函数 \n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(finetune_model.fc.parameters(), lr=1e-3, momentum=0.9)\n",
    "# 定义训练模型的函数\n",
    "batch_size = 32      # 定义batch_size\n",
    "epochs = 1           # 定义epoch最大次数\n",
    "max_batches = np.ceil(len(train_datasets) / batch_size)*epochs\n",
    "# print(max_batches)\n",
    "\n",
    "def train(model, batch_size, epochs, save_path='./model'):\n",
    "    num_batches = 0                                    # 记录batches的数目\n",
    "    train_loader = DataLoader(train_datasets, batch_size=batch_size, shuffle=True,\n",
    "                             num_workers=4) \n",
    "    for epoch in range(epochs):\n",
    "        print('-'*20)\n",
    "        print('Epoch {}'.format(epoch+1))\n",
    "        for data in train_loader:\n",
    "              # 获取数据并转换为Variable\n",
    "#             x_train, y_train = Variable(data[0]),Variable(data[1]) \n",
    "#             if torch.cuda.is_available():\n",
    "#                 x_train, y_train = x_train.cuda(), y_train.cuda() \n",
    "#                 model = model.cuda()  \n",
    "\n",
    "             # 将变量及模型放到GPU上\n",
    "            x_train, y_train = data\n",
    "            x_train, y_train = x_train.to(device), y_train.to(device)\n",
    "            model.to(device)\n",
    "        \n",
    "            # forward + backward + optimizer    \n",
    "            out = model(x_train)                  # 计算输出\n",
    "            loss = criterion(out, y_train)        # 计算损失函数\n",
    "            print_loss = loss.data.item()\n",
    "            optimizer.zero_grad()                 # 梯度归零\n",
    "            loss.backward()                       # 反向传播\n",
    "            optimizer.step()                      # 更新参数\n",
    "#             print(num_batches)\n",
    "                        \n",
    "            if (num_batches) % 10 == 0:\n",
    "                print('Batches {} loss {:.4f}'.format(num_batches, print_loss))\n",
    "            num_batches += 1\n",
    "            if num_batches == 100:               # 为了快速验证程序，中断训练\n",
    "                break\n",
    "    # 存储路径        \n",
    "    save_path = os.path.join(save_path, 'model_{}.pth'.format(num_batches))   \n",
    "    torch.save(model, save_path)                #存储路径\n",
    "     \n",
    "train(finetune_model, batch_size, epochs)         # 训练网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 模型的权重已经保存到model文件夹中\n",
    "save_model = torch.load('./model/model_100.pth')\n",
    "save_model = save_model.cuda() if torch.cuda.is_available() else save_model\n",
    "# print(save_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 5.评价模型的性能\n",
    "def test(model, batch_size=32):\n",
    "    test_loader = DataLoader(test_datasets, batch_size=batch_size, shuffle=False)\n",
    "    \n",
    "    model.eval()      # 将模型转换为测试状态\n",
    "    total_loss = 0\n",
    "    total_acc = 0\n",
    "    test_epoch = 0 \n",
    "    for data in test_loader:\n",
    "        eval_loss = 0\n",
    "        eval_acc = 0\n",
    "        img, label = data      # 获取测试数据\n",
    "    #     print(img.shape)\n",
    "        # 由于测试状态下不需方向传播，所以可以释放缓存\n",
    "        with torch.no_grad():\n",
    "#             img, label = (Variable(img).cuda(), Variable(label).cuda()) \\\n",
    "#                          if torch.cuda.is_available() \\\n",
    "#                          else (Variable(img), Variable(label))\n",
    "            img, label = img.to(device), label.to(device)\n",
    "        out = model(img)     # 计算图像的标签 [img.size(0), 10]\n",
    "        loss = criterion(out, label)\n",
    "        eval_loss += loss.data* label.size(0)   # 计算该批次的总损失\n",
    "        _, pred = torch.max(out, 1)          # 在一行内按列比大小得[64,1],tenso为[64]\n",
    "    #     print(_, pred.shape)\n",
    "        num_correct = (pred == label).sum()\n",
    "        eval_acc += num_correct.data\n",
    "    #     print(eval_acc)    \n",
    "        total_loss += eval_loss    # 累计所有批次数据的损失和准确率\n",
    "        total_acc  += eval_acc\n",
    "        if (test_epoch + 1) % 10 == 0:\n",
    "            batch_loss  = (eval_loss / img.size(0))        # 计算该批次的损失\n",
    "            batch_acc   = (eval_acc.float() / img.size(0)) # 计算该批次的准确率\n",
    "            print('Epoch: {} Test Loss: {:.6f}, ACC: {:.6f}'.format(test_epoch+1, batch_loss, batch_acc))\n",
    "        test_epoch += 1\n",
    "    print('----------Test Done!----------')\n",
    "    print('Epoch: {} Total_Loss: {:.6f} Total_ACC: {:.6f}'.format(\\\n",
    "          test_epoch, total_loss/len(test_datasets), float(total_acc)/len(test_datasets)))\n",
    "    \n",
    "# test(save_model)         # 评估模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 方式二、直接读取模型权重，并修改模型的全连接层\n",
    "def finetune(model, pretrained_w, num_classes=1000):\n",
    "    \"\"\"model:需要finetune的模型\n",
    "       pretrained_w:model网络的权重(注意这里的权重和网络要对应好)的路径\n",
    "       num_classes:网络分类的数目，全连接网络的待修改输出维度\n",
    "    \"\"\"\n",
    "    assert os.path.exists(pretrained_w), 'weight file is not exist'   # 保证权重读取正确\n",
    "    net_weight = torch.load(pretrained_w)                             # 导入本地的权重\n",
    "    model.load_state_dict(net_weight)                                 # 权重导入模型\n",
    "    \n",
    "    for param in model.parameters():               # 使所有权重的require_grad为 False，固定权重\n",
    "        param.requires_grad = False   \n",
    "    # model.fc中fc是torchvision定义resnet中的全连接层名称\n",
    "    model.fc = nn.Linear(model.fc.in_features, num_classes)           # 重新定义最后的全连接层\n",
    "    \n",
    "    return model\n",
    "    \n",
    "origin_model = models.resnet18()                                      # 定义原始网络，输出为1000类\n",
    "weight_path = os.path.join('./model', 'resnet18-5c106cde.pth')        # 预训练网络的权重路径\n",
    "finetune_model2 = finetune(origin_model, weight_path, num_classes=10) # 微调模型并返回新模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 全局微调\n",
    "- 不同的层指定**不同的学习率**\n",
    "- 在不修改网络定义程序的情况下为模型**增加新的层**\n",
    "\n",
    "实现方法：\n",
    "1. **函数形式**：直接使用`model.new_layer = nn.Linear(in_features, out_features)`的形式添加\n",
    "2. **类形式**：可以定义新的类来添加新的层，及修改最后全连接层的输出维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义新的类，实现定义新的层及修改最后全连接层维度\n",
    "class AddLayerModel(nn.Module):\n",
    "    def __init__(self, model, feature_size, num_classes):\n",
    "        super().__init__()         # 类初始化\n",
    "        # 输出维度为model.fc.in_features(model源码相关，这里仍使用torchvision定义的模型)\n",
    "        # 参考https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py\n",
    "        # fc是torchvision中模型的定义的全连接层的名称\n",
    "        # 读取模型除最后一层外的其他层\n",
    "        self.features = nn.Sequential(*list(model.children())[:-1])\n",
    "        \n",
    "        self.fc_inputs = model.fc.in_features   # 获取全连接层输入维度, in_features是Linear层的属性\n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(self.fc_inputs, feature_size),\n",
    "            nn.BatchNorm2d(feature_size),\n",
    "            nn.ReLU(True),\n",
    "            nn.Dropout(0.5),\n",
    "            nn.Linear(feature_size, feature_size),\n",
    "            nn.BatchNorm2d(feature_size),\n",
    "            nn.ReLU(True),\n",
    "            nn.Dropout(0.5),\n",
    "            nn.Linear(feature_size, num_classes)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        out = self.features(x)               # 模型提取的特征\n",
    "        out = out.view(out.size(0), -1)      # reshape为向量\n",
    "        out = self.fc(out)                   # 全连接层部分的输出\n",
    "        return out\n",
    "\n",
    "origin_model = models.resnet18()\n",
    "new_model = AddLayerModel(origin_model, feature_size=250, num_classes=10)\n",
    "# print(new_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SGD (\n",
      "Parameter Group 0\n",
      "    dampening: 0\n",
      "    lr: 0.01\n",
      "    momentum: 0.9\n",
      "    nesterov: False\n",
      "    weight_decay: 0\n",
      "\n",
      "Parameter Group 1\n",
      "    dampening: 0\n",
      "    lr: 0.001\n",
      "    momentum: 0.9\n",
      "    nesterov: False\n",
      "    weight_decay: 0\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "# 全局微调，为不同的层设置相应的学习率\n",
    "# 方法一、对模型层名称不清楚(除全连接层名称fc外)\n",
    "ignored_params = list(map(id, new_model.fc.parameters()))    # 获取后面几层的id\n",
    "base_params = filter(lambda x: id(x) not in ignored_params, new_model.parameters()) # 后面几层的参数\n",
    "optimizer = optim.SGD([\n",
    "            {'params': base_params},\n",
    "            {'params': new_model.fc.parameters(), 'lr': 1e-3}\n",
    "            ], lr=1e-2, momentum=0.9)\n",
    "\n",
    "# 方法二、对模型层名称清楚\n",
    "optimizer1 = optim.SGD([\n",
    "            {'params': new_model.features.parameters()},\n",
    "            {'params': new_model.fc.parameters(), 'lr': 1e-3}\n",
    "            ], lr=1e-2, momentum=0.9)\n",
    "print(optimizer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "小结:\n",
    "- `nn.Linear()`和`nn.Conv2d()`等定义的层，require_grad默认都是True，即默认都要进行梯度计算\n",
    "- `nn.Sequential(*list(model.children())[:-1])`可以去除最后一层全连接层，而提取其他层\n",
    "- **注意：使用x_train, y_train = map(Variable, data)的方法容易出错，不推荐使用**"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
